package dao;


import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;

import javax.persistence.NoResultException;
import javax.persistence.PersistenceException;
import javax.persistence.Query;
import javax.swing.JOptionPane;

import org.hibernate.ejb.criteria.expression.BinaryArithmeticOperation;

import dao.MoodleDAO;
import moodle.dados.Aluno;
import moodle.dados.Atividade;
import moodle.dados.Curso;
import moodle.dados.Log;
import moodle.dados.Pessoa;
import moodle.dados.Tag;
import moodle.dados.Tutor;
import moodle.dados.atividades.AtividadeNota;
import moodle.dados.atividades.AtividadeParticipacao;
import moodle.dados.atividades.Chat;
import moodle.dados.atividades.DataBase;
import moodle.dados.atividades.Escolha;
import moodle.dados.atividades.FerramentaExterna;
import moodle.dados.atividades.Forum;
import moodle.dados.atividades.Glossario;
import moodle.dados.atividades.LaboratorioDeAvaliacao;
import moodle.dados.atividades.Licao;
import moodle.dados.atividades.Questionario;
import moodle.dados.atividades.Tarefa;
import moodle.dados.atividades.Wiki;
import moodle.dados.grupos.Grupo;

public class GerenciaCurso {

	private List<Curso> cursos;
	 
	
	public GerenciaCurso() {
		cursos = new ArrayList<Curso>();
		
	}
	
	public List<Curso> getCursos(){
		return cursos;
	}
	
	
	public void addCursos(){
		MoodleDAO<Curso> cursoDAO = new MoodleDAO<Curso>();
		cursos = cursoDAO.find("SELECT c FROM Curso c");
		
		
		
	}

	public static <T extends AtividadeParticipacao> List<T> addAtividadeParticipacaoCurso(String query, Curso curso){
		
		Query q = MoodleDAO.createNamedQuery(query);
		q.setParameter(1, curso.getId());
		
		List<T> atividades = q.getResultList();
		
		curso.addAtividadeParticipacao(atividades);
		
		
		return atividades;
	}
	
	public static <T extends AtividadeNota> List<T> addAtividadeNotaCurso(String query, Curso curso){
		
		Query q = MoodleDAO.createNamedQuery(query);
		q.setParameter(1, curso.getId());
		
		List<T> atividades = q.getResultList();
		
		curso.addAtividadeNota(atividades);
		
		
		return atividades;
	}
	
	
	public static void addAlunosCurso(Curso curso){

		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_context WHERE contextlevel=50 and instanceid = ?1");
		query.setParameter(1, curso.getId());
		
		Query query2 = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_role_assignments WHERE roleid=5 and contextid = ?1");
		query2.setParameter(1, query.getSingleResult());
		
		List<BigInteger> usersIds = query2.getResultList();
		
		Iterator<BigInteger> iterator = usersIds.iterator();
		
		BigInteger idUser;
		
		MoodleDAO<Aluno> alunoDAO = new MoodleDAO<Aluno>();
		
		Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
		
		
		while(iterator.hasNext()){
			idUser = iterator.next();
			
			queryAluno.setParameter(1, idUser);
			
			Aluno a = (Aluno)queryAluno.getSingleResult();
			
			curso.addAluno(a);
	
		}
		
	}
	
	public static void calculaNotaGeralAlunos(Curso curso){
		
		for(Aluno aluno : curso.getAlunos()){
			
			try{
				
				Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and itemtype = 'course' ");
				query.setParameter(1, curso.getId());
				
				BigInteger itemIdCurso = (BigInteger) query.getSingleResult();
				
				Query query2 = MoodleDAO.findNativeQueryParameterized("SELECT finalgrade FROM mdl_grade_grades WHERE itemid = ?1 and userid = ?2");
				query2.setParameter(1, itemIdCurso);
				query2.setParameter(2, aluno.getId());
				
				
				
				curso.getNotaGeralAlunos().put(aluno,(BigDecimal)query2.getSingleResult());
				
			}catch(NoResultException e){
				continue;
			}
			
		}
		
		
		
		
	}
	
	public static void addGruposCurso(Curso curso){
		
		Query query = MoodleDAO.createNamedQuery("Grupo.findByCourse");
		query.setParameter(1, curso.getId());
		
		
		List<Grupo> grupos = query.getResultList();
		
		if(!grupos.isEmpty()){
			curso.addGrupo(grupos);
			
			for(Grupo g : grupos){
				
				
				
				Query queryIdAluno = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_groups_members WHERE groupid = ?1");
				queryIdAluno.setParameter(1, g.getId());
				
				List<BigInteger> ids = queryIdAluno.getResultList();
				
				if(!ids.isEmpty()){
					
					for(BigInteger id : ids){
						Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
						queryAluno.setParameter(1, id);
						
						Aluno al = (Aluno)queryAluno.getSingleResult();
						
						g.addMembro(al);
					}
					
				}
				
			}
		}
		
		
	}
	
	public static void addCursosPreRequisito(Curso curso){
		
		Query queryIdsPreRequisito = MoodleDAO.findNativeQueryParameterized("SELECT courseInstance FROM mdl_course_completion_criteria WHERE course = ?1");
		queryIdsPreRequisito.setParameter(1, curso.getId());
		
		List<BigInteger> ids = queryIdsPreRequisito.getResultList();
		
		if(!ids.isEmpty()){
		
			for(BigInteger id : ids){
				Query q = MoodleDAO.createNamedQuery("Curso.findById");
				q.setParameter(1, id);
				
				try{
				
					Curso c = (Curso)q.getSingleResult();
					curso.getCursosPreRequisito().add(c);
				}catch(NoResultException e){
					continue;
				}
				
				
			}
		}
		
		
	}
	
	
	
	public static void addLogsDoAluno(Curso c){

		Set<Aluno> alunos = c.getAlunos();
	
		for (Aluno aluno : alunos) {
			Query query = MoodleDAO.createNamedQuery("Log.findByCourse");
			query.setParameter(1, c.getId());
			query.setParameter(2, aluno.getId());
			List<Log> logs = query.getResultList();
			
			if(!aluno.getLogs().containsAll(logs))
				aluno.addLogs(logs);
			
			Query query1 = MoodleDAO.createNamedQuery("Log.findByUm");
			query1.setParameter(1, aluno.getId());
			List<Log> logs1 = query1.getResultList();
			
			if(!aluno.getLogs().containsAll(logs1))
				aluno.addLogs(logs1);
		}
	
	}
	
	public static void addTags(Curso c) {
		Set<Aluno> alunos = c.getAlunos();

		for (Aluno a : alunos) {

			Query query = MoodleDAO.findNativeQueryParameterized("SELECT tagid FROM mdl_tag_instance WHERE itemid = ?1");
			query.setParameter(1, a.getId());

			List<BigInteger> idsItens = query.getResultList();
			List<Tag> tags = new ArrayList<Tag>();

			for (BigInteger item : idsItens) {

				Query query2 = MoodleDAO.createNamedQuery("TagById");
				query2.setParameter(1, item.longValue());
				try {
					Tag tag = (Tag) query2.getSingleResult();
					tags.add(tag);
				} catch (NoResultException e) {

				}
			}

			if (!a.getTags().containsAll(tags)) {
				a.addTags(tags);
			}

		}

	}
	
	public static void addTutorCurso(Curso curso){
		Query query = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_context WHERE contextlevel=50 and instanceid = ?1");
		query.setParameter(1, curso.getId());
		
		
		try{
			
			Query query2 = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_role_assignments WHERE roleid=4 and contextid = ?1");
			query2.setParameter(1, query.getSingleResult());
		
		
			BigInteger idTutor = (BigInteger) query2.getSingleResult();
		
			Query queryTutor = MoodleDAO.createNamedQuery("Tutor.findById");
				
			queryTutor.setParameter(1, idTutor);
				
			Tutor t = (Tutor) queryTutor.getSingleResult();
				
			curso.addTutor(t);
		
		}catch(NoResultException e){
			
		
		
		}
		
	}
	
	/*
	
	public static void addAtividadePesquisaAvaliacao(Curso curso){
		
		List<PesquisaAvaliacao> pesquisas = addAtividadeParticipacaoCurso("PesquisaAvaliacao.findByCourse", curso);
		
		List<Aluno> alunosCurso = curso.getAlunos();
		
		Query queryAluno = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_survey_answers WHERE survey = ?1 and userid = ?2 LIMIT 1");
		
		if(!pesquisas.isEmpty()){
			
			for(PesquisaAvaliacao pa : pesquisas){
				
				queryAluno.setParameter(1, pa.getId());
				
				for(Aluno a : alunosCurso){
					
					queryAluno.setParameter(2, a.getId());
					
					
					if(!queryAluno.getResultList().isEmpty() && !pa.getAlunosParticipantes().contains(a) ){
						pa.addAlunosParticipantes(a);				
					}
				}
			}			
		}
	}
	
	*/
	
	
	public static void addAtividadeBancoDeDados(Curso curso){
		
		List<DataBase> bases = addAtividadeParticipacaoCurso("DataBase.findByCourse", curso);
				
		
		if(!bases.isEmpty()){
		
			Query queryAlunoId = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_data_records WHERE dataid = ?1");
			Query queryDbItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'data' ");
			Query queryDbgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			for(DataBase db : bases){	
				
								
				if(!db.isAvaliativo()){
					
					queryAlunoId.setParameter(1, db.getId());
					List<BigInteger> ids = queryAlunoId.getResultList();
					
					if(!ids.isEmpty()){
						
						for(BigInteger id : ids){
							Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
							queryAluno.setParameter(1, id);
							
							Aluno al = (Aluno)queryAluno.getSingleResult();
							
							db.addAlunosParticipantes(al);
						}
						
					}
					
					
					
					
					
				}else{
					
					queryDbItem.setParameter(1, curso.getId());
					queryDbItem.setParameter(2, db.getId());
					
					BigInteger idDb =  (BigInteger)queryDbItem.getSingleResult();
					
					queryDbgrade.setParameter(1, idDb);
					
					List<Object[]> usuariosComNota = queryDbgrade.getResultList();
					
					for(Object[] tupla : usuariosComNota){
						
						Query q = MoodleDAO.createNamedQuery("Aluno.findById");
						q.setParameter(1, (BigInteger)tupla[0]);
						
						Aluno al = (Aluno)q.getSingleResult();
						
						db.addAlunoComNota(al, (BigDecimal)tupla[1]);
						
					}
					
					
					
				}
					
				
			}
		}
	}
	
	
	public static void addAtividadeGlossario(Curso curso) {
		
		List<Glossario> glossarios = addAtividadeParticipacaoCurso("Glossario.findByCourse", curso);
		
		if(!glossarios.isEmpty()){
		
			Query queryAlunoId = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_glossary_entries WHERE glossaryid =?1");
			Query queryGlItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'glossary'");
			Query queryGlgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			for(Glossario gl : glossarios){
				
				
				if(!gl.isAvaliativo()){
					
					queryAlunoId.setParameter(1, gl.getId());
					List<BigInteger> ids = queryAlunoId.getResultList();
					
					if(!ids.isEmpty()){
						
						for(BigInteger id : ids){
							Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
							queryAluno.setParameter(1, id);
							
							Aluno al = (Aluno)queryAluno.getSingleResult();
							
							gl.addAlunosParticipantes(al);
						}
						
					}
					
				}else{
					
					queryGlItem.setParameter(1, curso.getId());
			
					queryGlItem.setParameter(2, gl.getId());
					
					BigInteger idGl =  (BigInteger)queryGlItem.getSingleResult();
					
					queryGlgrade.setParameter(1, idGl);
					
					List<Object[]> usuariosComNota = queryGlgrade.getResultList();
					
					for(Object[] tupla : usuariosComNota){
						
						Query q = MoodleDAO.createNamedQuery("Aluno.findById");
					
						q.setParameter(1, (BigInteger)tupla[0]);
						
						Aluno al = (Aluno)q.getSingleResult();
						
						gl.addAlunoComNota(al, (BigDecimal)tupla[1]);
						
					}
					
					
				}
				
				
			}
		}
		
	}
	
	
	
	
	public static void addAtividadeEscolha(Curso curso){
		
		List<Escolha> escolhas = addAtividadeParticipacaoCurso("Escolha.findByCourse", curso);
		
		
		if(!escolhas.isEmpty()){
			
			Query queryAlunoId = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_choice_answers WHERE choiceid =?1");
			
			for(Escolha esc : escolhas){
				
					
				queryAlunoId.setParameter(1, esc.getId());
				List<BigInteger> ids = queryAlunoId.getResultList();
					
				if(!ids.isEmpty()){
						
				for(BigInteger id : ids){
					Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
					queryAluno.setParameter(1, id);
							
					Aluno al = (Aluno)queryAluno.getSingleResult();
							
					esc.addAlunosParticipantes(al);
					}
						
				}
					
			}
			
		}
		
		
		
	}
	
	public static void addAtividadeChat(Curso curso){
		List<Chat> chats = addAtividadeParticipacaoCurso("Chat.findByCourse", curso);
		
		if(!chats.isEmpty()){
			
			Query query = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_chat_messages_current WHERE chatid = ?1");
			
			for(Chat chat : chats){
				query.setParameter(1, chat.getId());
				List<BigInteger> ids = query.getResultList();
				
				if(!ids.isEmpty()){
				
					for(BigInteger id : ids){
                    
						Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");
                        queryAluno.setParameter(1, id);
                        Aluno al = (Aluno)queryAluno.getSingleResult();                
                                
                        chat.addAlunosParticipantes(al);
                                        
                        }
				}
			}
		}
	}
	
	
	public static void addAtividadeForum(Curso curso) {

		List<Forum> foruns = addAtividadeParticipacaoCurso("Forum.findByCourse", curso);

		BigInteger idTutor = null;
		try {
			idTutor = curso.getTutor().getId();
		} catch (NullPointerException e) {

		}

		if (!foruns.isEmpty()) {

			for (Forum forum : foruns) {

				if (!forum.isAvaliativo()) {
					// lista de ids das discursoes de um forum
					List<BigInteger> idsDiscurcoes = MoodleDAO.findNativeQueryList("SELECT id FROM mdl_forum_discussions WHERE forum = "+ forum.getId());
					if (!idsDiscurcoes.isEmpty()) {
						for (BigInteger iddisc : idsDiscurcoes) {
							// Lisca com os ids de cada discursão
							List<BigInteger> idsPosts = MoodleDAO.findNativeQueryList("SELECT id FROM mdl_forum_posts WHERE discussion = "+ iddisc);

							for (BigInteger id2 : idsPosts) {

								try {
									BigInteger idAluno = MoodleDAO.findNativeQuery("SELECT userid FROM mdl_forum_posts WHERE id="+ id2);
									if (idAluno == idTutor) {
										forum.setTutorParticipa(true);
										BigInteger dataPost = MoodleDAO.findNativeQuery("SELECT created FROM mdl_forum_posts WHERE id="+ id2);
										long ultimaPartipacao = dataPost.longValue();
										forum.setUltimaPartipacao(ultimaPartipacao);
									} else {

										Query queryAluno = MoodleDAO.createNamedQuery("Aluno.findById");

										queryAluno.setParameter(1, idAluno);

										Aluno al = (Aluno) queryAluno.getSingleResult();
										
										BigInteger dataPost = MoodleDAO.findNativeQuery("SELECT created FROM mdl_forum_posts WHERE id="+ id2);
										forum.setUltimoPost(dataPost.longValue());
										
										if (!forum.getAlunosParticipantes().contains(al)){
											forum.addAlunosParticipantes(al);
										}
									}
								} catch (NoResultException e) {
									
								}

							}
						}
					}

				} else {
					
					List<BigInteger> idsDiscurcoes = MoodleDAO.findNativeQueryList("SELECT id FROM mdl_forum_discussions WHERE forum = "+ forum.getId());
					if (!idsDiscurcoes.isEmpty()) {
						for (BigInteger iddisc : idsDiscurcoes) {
							List<BigInteger> idsPosts = MoodleDAO.findNativeQueryList("SELECT id FROM mdl_forum_posts WHERE discussion = "+ iddisc);
							for (BigInteger id2 : idsPosts) {
								try {
									BigInteger idAluno = MoodleDAO.findNativeQuery("SELECT userid FROM mdl_forum_posts WHERE id="+ id2);
									if (idAluno == idTutor){ 
										forum.setTutorParticipa(true);
										BigInteger dataPost = MoodleDAO.findNativeQuery("SELECT created FROM mdl_forum_posts WHERE id="+ id2);
										long ultimaPartipacao = dataPost.longValue();
										forum.setUltimaPartipacao(ultimaPartipacao);
									}else{
										BigInteger dataPost = MoodleDAO.findNativeQuery("SELECT created FROM mdl_forum_posts WHERE id="+ id2);
										forum.setUltimoPost(dataPost.longValue());
									}
								}catch(NoResultException e){
									
								}
							}
						}
					}
					
					Query queryFrItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'forum'");

					Query queryFrgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");

					queryFrItem.setParameter(1, curso.getId());

					queryFrItem.setParameter(2, forum.getId());

					BigInteger idDb = (BigInteger) queryFrItem.getSingleResult();

					queryFrgrade.setParameter(1, idDb);

					List<Object[]> usuariosComNota = queryFrgrade.getResultList();

					for (Object[] tupla : usuariosComNota) {
						
						Query q = MoodleDAO.createNamedQuery("Aluno.findById");

						q.setParameter(1, (BigInteger) tupla[0]);

						Aluno al = (Aluno) q.getSingleResult();
						
						forum.addAlunoComNota(al, (BigDecimal) tupla[1]);
					}
				}
			}
		}
	}
		
	/*
	
	public static void addAtividadeScorm(Curso curso){
		
		List<Scorm> scorms = addAtividadeParticipacaoCurso("Scorm.findByCourse", curso);
		
		
	}open
	
	*/
	
	public static void addAtividadeWiki(Curso curso){
			
		List<Wiki> wikis = addAtividadeParticipacaoCurso("Wiki.findByCourse", curso);
	
		for(Wiki wi : wikis){
			
			if(wi.getWikimode().equals("collaborative")){
				
				Query queryPageWiki = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_wiki_subwikis WHERE wikiid = ?1 LIMIT 1");
				queryPageWiki.setParameter(1, wi.getId());
				
				
				
				try{
					BigInteger id = (BigInteger) queryPageWiki.getSingleResult();
					
					Query queryUserWiki = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_wiki_versions WHERE pageid = ?1");
					queryUserWiki.setParameter(1, id);
					
					List<BigInteger> idAlunos = queryUserWiki.getResultList();
					
					for(BigInteger idAluno : idAlunos){
						Query cadaAluno = MoodleDAO.createNamedQuery("Aluno.findById");
						cadaAluno.setParameter(1, idAluno);
						
						Aluno alunoWiki = (Aluno)cadaAluno.getSingleResult();
						
						wi.getAlunosParticipantes().add(alunoWiki);
					}
					
					
					
				}catch(NoResultException e){
					continue;
				}
			}else{
				
				Query queryUserWiki = MoodleDAO.findNativeQueryParameterized("SELECT userid FROM mdl_wiki_subwikis WHERE wikiid = ?1");
				queryUserWiki.setParameter(1, wi.getId());
				
				List<BigInteger> idAlunos = queryUserWiki.getResultList();
				
				for(BigInteger idAluno : idAlunos){
					Query cadaAluno = MoodleDAO.createNamedQuery("Aluno.findById");
					cadaAluno.setParameter(1, idAluno);
					
					Aluno alunoWiki = (Aluno)cadaAluno.getSingleResult();
					
						wi.getAlunosParticipantes().add(alunoWiki);
				}
				
				
			}
		}
	
		
	}
	
	public static void addAtividadeQuestionario(Curso curso){
	
		
		List<Questionario> questionarios = addAtividadeNotaCurso("Questionario.findByCourse", curso);
		
		if(!questionarios.isEmpty()){
		
			Query queryQuesItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'quiz' ");
			Query queryQuesgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			addAlunoNota(curso.getId(), questionarios, queryQuesItem, queryQuesgrade);
			
				
			
		}
		
	}
	
	
	
	public static void addAtividadeTarefas(Curso curso) {
		
		List<Tarefa> tarefas = addAtividadeNotaCurso("Tarefa.findByCourse", curso);
		
		if(!tarefas.isEmpty()){
		
			Query queryTarItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'assign' ");
			Query queryTargrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			addAlunoNota(curso.getId(), tarefas, queryTarItem, queryTargrade);
					
		}
		
	}
	
	
	
	public static void addAtividadeFerramentaExterna(Curso curso) {
	
	List<FerramentaExterna> ferramentas = addAtividadeNotaCurso("FerramentaExterna.findByCourse", curso);
		
		if(!ferramentas.isEmpty()){
		
			Query queryFerItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'lti' ");
			Query queryFergrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			addAlunoNota(curso.getId(), ferramentas, queryFerItem, queryFergrade);
				
			
		}
		
	}
	
	
	public static void addAlunoNota(BigInteger idCurso, List<? extends Atividade> list, Query q1, Query q2){
		
		for(Atividade at : list){
			
			q1.setParameter(1, idCurso);
			q1.setParameter(2, at.getId());
			
			BigInteger id =  (BigInteger)q1.getSingleResult();
			
			q2.setParameter(1, id);
			
			List<Object[]> usuariosComNota = q2.getResultList();
			
			for(Object[] tupla : usuariosComNota){
				
				Query q = MoodleDAO.createNamedQuery("Aluno.findById");
				q.setParameter(1, (BigInteger)tupla[0]);
				
				Aluno al = (Aluno)q.getSingleResult();
				
				at.addAlunoComNota(al, (BigDecimal)tupla[1]);
				
			}
			
			
		
			
		}
	
		
	}
	
	
	
	
	
	public static void addAtividadeLicao(Curso curso) {
	
		List<Licao> licoes = addAtividadeNotaCurso("Licao.findByCourse", curso);
		
		if(!licoes.isEmpty()){
		
			Query queryLicItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'lesson' ");
			Query queryLicgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			addAlunoNota(curso.getId(), licoes, queryLicItem, queryLicgrade);
				
			
		}
		
	}
	
	
	
	
	
	public static void addAtividadeLaboratorioDeAvaliacao(Curso curso) {
		
		List<LaboratorioDeAvaliacao> labs = addAtividadeNotaCurso("LaboratorioDeAvaliacao.findByCourse", curso);
		
		if(!labs.isEmpty()){
		
			Query queryLabItem = MoodleDAO.findNativeQueryParameterized("SELECT id FROM mdl_grade_items WHERE courseid = ?1 and iteminstance = ?2 and itemmodule = 'workshop' ");
			Query queryLabgrade = MoodleDAO.findNativeQueryParameterized("SELECT  userid, finalgrade FROM mdl_grade_grades WHERE itemid = ?1");
			
			
			for(LaboratorioDeAvaliacao lab : labs){
				
				queryLabItem.setParameter(1, curso.getId());
				queryLabItem.setParameter(2, lab.getId());
				
				List<BigInteger> ids =  queryLabItem.getResultList();
				
				int cont = 0;
				
				for(BigInteger id : ids){
				
					queryLabgrade.setParameter(1, id);
					
					List<Object[]> usuariosComNota = queryLabgrade.getResultList();
					
					for(Object[] tupla : usuariosComNota){
						
						Query q = MoodleDAO.createNamedQuery("Aluno.findById");
						q.setParameter(1, (BigInteger)tupla[0]);
						
						Aluno al = (Aluno)q.getSingleResult();
						
						if(cont == 0){
							
								lab.addAlunoComNota(al, (BigDecimal)tupla[1]);		
						
						}else{
							
								lab.addNota2(al, (BigDecimal)tupla[1]);
						}
						
						
					}
					cont++;
					
				}
				
				
					
			}
		}
	
	}
	
	
}